/* Copyright (c) 2006, 2009, Carl Burch. License information is located in the
 * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */
 
package com.cburch.logisim.analyze.gui;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import com.cburch.logisim.analyze.model.Entry;
import com.cburch.logisim.analyze.model.TruthTable;

class TruthTableMouseListener implements MouseListener {
    private int cellX;
    private int cellY;
    private Entry oldValue;
    private Entry newValue;
    
    public void mousePressed(MouseEvent event) {
        TruthTablePanel source = (TruthTablePanel) event.getSource();
        TruthTable model = source.getTruthTable();
        int cols = model.getInputColumnCount() + model.getOutputColumnCount();
        int rows = model.getRowCount();
        cellX = source.getOutputColumn(event);
        cellY = source.getRow(event);
        if(cellX < 0 || cellY < 0 || cellX >= cols || cellY >= rows) return;
        oldValue = source.getTruthTable().getOutputEntry(cellY, cellX);
        if(oldValue == Entry.ZERO)     newValue = Entry.ONE;
        else if(oldValue == Entry.ONE) newValue = Entry.DONT_CARE;
        else                           newValue = Entry.ZERO;
        source.setEntryProvisional(cellY, cellX, newValue);
    }
    public void mouseReleased(MouseEvent event) {
        TruthTablePanel source = (TruthTablePanel) event.getSource();
        TruthTable model = source.getTruthTable();
        int cols = model.getInputColumnCount() + model.getOutputColumnCount();
        int rows = model.getRowCount();
        if(cellX < 0 || cellY < 0 || cellX >= cols || cellY >= rows) return;

        int x = source.getOutputColumn(event);
        int y = source.getRow(event);
        TruthTable table = source.getTruthTable();
        if(x == cellX && y == cellY) {
            table.setOutputEntry(y, x, newValue);
        }
        source.setEntryProvisional(cellY, cellX, null);
        cellX = -1;
        cellY = -1;
    }

    public void mouseClicked(MouseEvent e) { }
    public void mouseEntered(MouseEvent e) { }
    public void mouseExited(MouseEvent e) { }
}
